package com.aliwo.rereflect;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * .
 *
 * @author Xu Yayuan
 * @date 2022/2/20
 */
public class ReReflectQuestion2 {
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.load(new FileInputStream("D:\\person-workSpace\\reflect-project\\src\\main\\resources\\re.properties"));
        Object className = prop.get("classfullpath");
        Object methodName = prop.get("method");
        System.out.println("获取classfullpath的值:" + methodName);
        System.out.println("获取method的值:" + methodName);
        //一：加载类，返回Class类型的对象cls
        Class cls = Class.forName(className.toString());
        System.out.println("cls :" + cls);
        //二: 通过 cls 得到你加载类 com.aliwo.Cat的对象实例
        Object class01 = cls.newInstance();
        System.out.println("class01:" + class01);
        // 通过 cls 得到你加载方法的方法对象
        Method method = cls.getMethod(methodName.toString());
        System.out.println("method:" + method);
        // 传统方法 对象.方法()，反射机制中 方法.invoke(对象)
        method.invoke(class01);
        // 成员变量的操作 , getField只能得到公共的成员变量(public修饰的)
        Field usernameField = cls.getField("username"); //usernameField 成员变量对象
        System.out.println("成员变量的值:" + usernameField.get(class01)); // 传统方法 对象.get成员变量，反射机制中 成员变量.get(对象)
        Field[] fields = cls.getFields();
        System.out.println("获取所有的公共成员(public修饰的)变量对象个数:" + fields.length);
        Constructor constructors = cls.getConstructor(String.class);
        System.out.println("constructors 构造器：" + constructors);
    }
}
